From a230979d98fdf45421a7d85e7201f5069bb6c108 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 27 Feb 2006 08:38:57 +0000 Subject: [PATCH] * (bug 5062) Width sometimes one pixel short when using maximum heights --- RELEASE-NOTES | 1 + includes/Image.php | 23 +++++++++++++--- tests/ImageTest.php | 66 +++++++++++++++++++++++++++++++++++++++++++++ tests/RunTests.php | 9 ++++++- 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 tests/ImageTest.php diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 87f2b8880d..f1c2f6305c 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -666,6 +666,7 @@ fully support the editing toolbar, but was found to be too confusing. * (bug 5086) Force image resize dimensions on ImageMagick, as for instance "-resize 100x35!"; some thumbs were off due to differences in rounding and would be generated smaller than expected. +* (bug 5062) Width sometimes one pixel short when using maximum heights === Caveats === diff --git a/includes/Image.php b/includes/Image.php index 309a1d7dcf..0afad6817f 100644 --- a/includes/Image.php +++ b/includes/Image.php @@ -867,10 +867,7 @@ class Image if ($this->canRender()) { if ( $width > $this->width * $height / $this->height ) - $width = floor( $this->width * $height / $this->height ); - # Note this is the largest width such that the thumbnail's - # height is at most $height. - + $width = wfFitBoxWidth( $this->width, $this->height, $height ); $thumb = $this->renderThumb( $width ); } else $thumb= NULL; #not a bitmap or renderable image, don't try. @@ -1919,4 +1916,22 @@ class ThumbnailImage { } } + +/** + * Calculate the largest thumbnail width for a given original file size + * such that the thumbnail's height is at most $maxHeight. + * @param int $boxWidth + * @param int $boxHeight + * @param int $maxHeight + * @return int + */ +function wfFitBoxWidth( $boxWidth, $boxHeight, $maxHeight ) { + $idealWidth = $boxWidth * $maxHeight / $boxHeight; + $roundedUp = ceil( $idealWidth ); + if( round( $roundedUp * $boxHeight / $boxWidth ) > $maxHeight ) + return floor( $idealWidth ); + else + return $roundedUp; +} + ?> diff --git a/tests/ImageTest.php b/tests/ImageTest.php new file mode 100644 index 0000000000..b06d4cbf90 --- /dev/null +++ b/tests/ImageTest.php @@ -0,0 +1,66 @@ +PHPUnit_TestCase( $name ); + } + + function setUp() { + } + + function tearDown() { + } + + function testFitBoxWidth() { + $vals = array( + array( + 'width' => 50, + 'height' => 50, + 'tests' => array( + 50 => 50, + 17 => 17, + 18 => 18 ) ), + array( + 'width' => 366, + 'height' => 300, + 'tests' => array( + 50 => 61, + 17 => 21, + 18 => 22 ) ), + array( + 'width' => 300, + 'height' => 366, + 'tests' => array( + 50 => 41, + 17 => 14, + 18 => 15 ) ), + array( + 'width' => 100, + 'height' => 400, + 'tests' => array( + 50 => 12, + 17 => 4, + 18 => 4 ) ) ); + foreach( $vals as $row ) { + extract( $row ); + foreach( $tests as $max => $expected ) { + $y = round( $expected * $height / $width ); + $result = wfFitBoxWidth( $width, $height, $max ); + $y2 = round( $result * $height / $width ); + $this->assertEquals( $expected, + $result, + "($width, $height, $max) wanted: {$expected}x$y, got: {$result}x$y2" ); + } + } + } + + /* TODO: many more! */ +} + +?> \ No newline at end of file diff --git a/tests/RunTests.php b/tests/RunTests.php index 4e6e64160d..e3486ef5b5 100644 --- a/tests/RunTests.php +++ b/tests/RunTests.php @@ -35,8 +35,15 @@ $tests = array( 'SearchMySQL4Test', 'ArticleTest', 'SanitizerTest', - 'CtypeTest' + 'CtypeTest', + 'ImageTest' ); + +if( isset( $_SERVER['argv'][1] ) ) { + // to override... + $tests = array( $_SERVER['argv'][1] ); +} + foreach( $tests as $test ) { require_once( $test . '.php' ); $suite = new PHPUnit_TestSuite( $test ); -- 2.20.1